#include <iostream>
using namespace std;

class A {
  public:
    virtual void vfunc1(){
      cout << "vfunc1()" << endl; 
    }
    virtual void vfunc2(){
      cout << "vfunc2()" << endl; 
    }
    void func1() {}
    void func2() {}
  public:
    int m_data1, m_data2;
};

class B: public A {
  public:
    void func3() {}
  private:
    int m_data3;
    int m_data4;
};

// pFn 是一个指针，指针指向一个函数
typedef void (*pFn)();
// pArr 是一个数组，其元素为指针，其指向一个指针，这个指针指向一个函数
typedef pFn *pArr[];
// VFPTR 指向指针数组的指针
typedef pArr *VFPTR;

void test() {
  A a;
  VFPTR vfptr = (VFPTR)&a;
  (*(*vfptr)[0])();
  
  cout << "typeid(a) type_info 的地址为" << &typeid(a) << endl; 
  cout << "vfptr 指向的第-1位地址" << *((*vfptr) - 1)<<  endl;
  cout << "vfptr 指向的第0位地址" << *(*vfptr)<<  endl;
  cout << "vfptr 指向的第0位地址" << (*vfptr)[0]<<  endl;
  cout << "vfptr 指向的第1位地址" << (*vfptr)[1]<<  endl;
  cout << "vfptr 指向的第2位地址" << (*vfptr)[2]<<  endl;

  cout << "a 对象的地址: " << &a << endl;
  cout << "a.m_data1 的地址：" << &(a.m_data1) << endl;
  cout << "A 类的大小" << sizeof(A) << endl;
  cout << "B 类的大小" << sizeof(B) << endl;
}

void test2() {
  A *a = new A();
  VFPTR vfptr = (VFPTR)a;
  (*(*vfptr)[0])();
  
  cout << "typeid(a) type_info 的地址为" << &typeid(a) << endl; 
  cout << "vfptr 指向的第-1位地址" << *((*vfptr) - 1)<<  endl;
  cout << "vfptr 指向的第0位地址" << *(*vfptr)<<  endl;
  cout << "vfptr 指向的第0位地址" << (*vfptr)[0]<<  endl;
  cout << "vfptr 指向的第1位地址" << (*vfptr)[1]<<  endl;
  cout << "vfptr 指向的第2位地址" << (*vfptr)[2]<<  endl;

  cout << "a 对象的地址: " << a << endl;
  cout << "a.m_data1 的地址：" << &(a->m_data1) << endl;
}

int main() {
  test2();
  return 0;
}
